package ru.spb.nicetu.altx.mnemo.extpoint.model.funcs;

import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;

import ru.spb.nicetu.altx.mnemo.extpoint.valuetypes.IProxyValueType;
import ru.spb.nicetu.altx.mnemo.extpoint.valuetypes.ITemplateValueType;
import ru.spb.nicetu.altx.mnemo.messages.IRunListener;
import ru.spb.nicetu.altx.mnemo.messages.RunMessage;

/**
 * Абстрактный базовый класс для унифицированного описания функций. Содержит 
 * множество входных и выходных ячеек для хранения данных-операндов и 
 * данных-результатов.
 */
@SuppressWarnings("unchecked")
public abstract class ASimpleFunc implements ISimpleFunc {

  protected Map<String, ITemplateValueType> id2Value = new HashMap<String, ITemplateValueType>();
  private Collection<IRunListener> listeners = new HashSet<IRunListener>();

  
  public ITemplateValueType getCellValue(String id) {
  // FIXME VALUE-MEMORY-Problem
  
    ITemplateValueType value = id2Value.get(id);
    // если в "Мешке" лежит Proxy, то отдадим Original
    if (value instanceof IProxyValueType) 
      value = ((IProxyValueType)value).getOriginalValue();

    return value;
  // end VALUE-MEMORY-Problem
    
    
//    return id2Value.get(id);
  }

  
  public void setCellValue(String id, ITemplateValueType value) {
    id2Value.put(id, value);
  }

  
  public void addRunListener(IRunListener listener) {
    listeners.add(listener);
  }

  
  public void removeRunListener(IRunListener listener) {
    listeners.remove(listener);
  }

  public void notifyAllRunListeners(RunMessage msg) {
    for (IRunListener listener : listeners) {
      listener.handleRunMessage(msg);
    }
  }
}
